package ar.com.logic.components;

import java.util.List;
import java.util.Vector;

import ar.com.logic.components.exceptions.NoExistenRespuestasException;
import ar.com.logic.components.interfaces.IHistoricoRespuestas;
import ar.com.logic.evaluador.Respuesta;

public class HistoricoRespuestas implements IHistoricoRespuestas {
	private List<Respuesta> respuestas;
	private Integer size;
	private Boolean incluyeCero;
	private Integer ultimoTurno;
	private List<Integer> numerosNoUtilizados;

	public HistoricoRespuestas(Integer size, Boolean incluyeCero) {

		this.size = size;
		this.incluyeCero = incluyeCero;
		this.respuestas = new Vector<Respuesta>();
		this.ultimoTurno = 0;
		int start = 0;
		this.numerosNoUtilizados = new Vector<Integer>();
		if (!incluyeCero)
			start = 1;

		for (int i = start; i <= 9; i++) {
			numerosNoUtilizados.add(i);
		}

	}

	public boolean add(Respuesta respuesta) {
		ultimoTurno++;
		if (numerosNoUtilizados.size() > 0) {
			numerosNoUtilizados.removeAll(respuesta.getNumero().getNumero());
		}
		return respuestas.add(respuesta);

	}

	public List<Integer> getNumerosNoUtilizados() {
		return numerosNoUtilizados;
	}

	public boolean hayNumerosSinUsar() {
		return this.numerosNoUtilizados.size() > 0;
	}

	public Integer obtenerTotalCorrectosEnNUltimasRespuestas(
			Integer cantidadRespuestas) {
		Integer cantidad = 0;
		for (int i = respuestas.size() - 1; i >= (respuestas.size() - cantidadRespuestas); i--) {
			cantidad += respuestas.get(i).getCorrectos();
		}
		return cantidad;
	}

	public Integer obtenerTotalRegularesEnNUltimasRespuestas(
			Integer cantidadRespuestas) {
		Integer cantidad = 0;
		for (int i = respuestas.size() - 1; i >= (respuestas.size() - cantidadRespuestas); i--) {
			cantidad += respuestas.get(i).getRegulares();
		}
		return cantidad;
	}

	// Suma correctos y regulares de las ultimas N respuestas en el historial

	public Integer obtenerTotalEncontradosEnNUltimasRespuestas(
			Integer cantidadRespuestas) {
		Integer cantidad = 0;
		for (int i = respuestas.size() - 1; i >= (respuestas.size() - cantidadRespuestas); i--) {
			cantidad += respuestas.get(i).getCorrectos()
					+ respuestas.get(i).getRegulares();
		}
		return cantidad;
	}


	public List<Respuesta> obtenerRespuestasConBien() {
		List<Respuesta> resultado = new Vector<Respuesta>();
		for (Respuesta respuesta : respuestas) {
			if (respuesta.getCorrectos() > 0) {
				resultado.add(respuesta);
			}
		}
		return resultado;
	}


	public List<Respuesta> obtenerRespuestasConBienExcluyente() {
		List<Respuesta> resultado = new Vector<Respuesta>();
		for (Respuesta respuesta : respuestas) {
			if (respuesta.getCorrectos() > 0 && respuesta.getRegulares() == 0) {
				resultado.add(respuesta);
			}
		}
		return resultado;
	}


	public List<Respuesta> obtenerRespuestasConRegular() {
		List<Respuesta> resultado = new Vector<Respuesta>();
		for (Respuesta respuesta : respuestas) {
			if (respuesta.getRegulares() > 0) {
				resultado.add(respuesta);
			}
		}
		return resultado;
	}

	public List<Respuesta> obtenerRespuestasConRegularExcluyente() {
		List<Respuesta> resultado = new Vector<Respuesta>();
		for (Respuesta respuesta : respuestas) {
			if (respuesta.getCorrectos() == 0 && respuesta.getRegulares() > 0) {
				resultado.add(respuesta);
			}
		}
		return resultado;
	}

	public List<Respuesta> obtenerRespuestasConNBien(Integer cantidad) {
		List<Respuesta> resultado = new Vector<Respuesta>();
		for (Respuesta respuesta : respuestas) {
			if (respuesta.getCorrectos() == cantidad) {
				resultado.add(respuesta);
			}
		}
		return resultado;
	}

	public List<Respuesta> obtenerRespuestasConNRegular(Integer cantidad) {
		List<Respuesta> resultado = new Vector<Respuesta>();
		for (Respuesta respuesta : respuestas) {
			if (respuesta.getRegulares() == cantidad) {
				resultado.add(respuesta);
			}
		}
		return resultado;
	}

	@Override
	public String toString() {
		String s = "Historico Rspuestas: \n";
		for (Respuesta respuesta : respuestas) {
			s += respuesta;
			s += "\n";
		}
		return s;

	}

	/* (non-Javadoc)
	 * @see ar.com.logic.components.IHistoricoRespuestas#getUltimoTurno()
	 */
	public Integer getUltimoTurno() {
		return ultimoTurno;
	}

	/* (non-Javadoc)
	 * @see ar.com.logic.components.IHistoricoRespuestas#contains(ar.com.logic.evaluador.Respuesta)
	 */
	public boolean contains(Respuesta r) {
		return this.respuestas.contains(r);
	}

	/* (non-Javadoc)
	 * @see ar.com.logic.components.IHistoricoRespuestas#borrarNoUtilizados()
	 */
	public void borrarNoUtilizados() {
		this.numerosNoUtilizados.clear();
		
	}

	public Integer getCantidadNumerosNoUtilizados() {
		// TODO Auto-generated method stub
		return this.numerosNoUtilizados.size();
	}

	public Respuesta obtenerUltimaRespuesta() {
		if(respuestas.size()>0){
		return this.respuestas.get(this.ultimoTurno -1);
		}else{
			return null;
		}
	}

	public List<Respuesta> obtenerResultadosConValor(Integer valor) {
		List<Respuesta> resultado = new Vector<Respuesta>();
		for (Respuesta respuesta : respuestas) {
			if(respuesta.getNumero().contiene(valor)){
				resultado.add(respuesta);
			}
		}
		return resultado;
	}

	public Respuesta obtenerPenUltimaRespuesta() {
		// TODO Auto-generated method stub
		if(respuestas.size()>1){
			return this.respuestas.get(this.ultimoTurno -2);
			}else{
				return null;
			}
	}

}
